<?php

/* * ***********************************************************************
  nom           :   Common Functional Library
  version       :   1.0
  autheur       :   pma
  date          :   01/12/2012
  description   :   Cette librairie comporte les fonctions générales et communes aux différents
  modules de l'application
  Remarque(s)   :   Mettre "A CODER" lorsqu'il y a un bout de code à terminer
 * *********************************************************************** */

//============================================================================
// HOSTS
//============================================================================
define('HOST_LOCAL', 0);
define('HOST_INTERNET', 1);
//============================================================================
// CONFIG
//============================================================================
define('MODE_HOST', HOST_LOCAL);
define('DEFAULT_ENCODING', 'UTF-8');
// autorise ou pas de garder en mémoire dans le navigateur client l'historique de saisie du champs
define('AUTOCOMPLETE', 'off');
//============================================================================
// PATHS
//============================================================================
if (MODE_HOST === HOST_LOCAL) {
    define('BASE_WWW', '/sirh/');
    define('PATH_WWW', 'http://localhost' . BASE_WWW);
    define('CAN_CREATE_DATABASE', TRUE);
} else {
    define('BASE_WWW', '/');
    define('PATH_WWW', 'http://www.sirh-consulting.fr' . BASE_WWW);
    define('CAN_CREATE_DATABASE', FALSE);
}

define('PATH_CSS', PATH_WWW . 'css/');
define('PATH_IMG', PATH_WWW . 'css/img/');
define('PATH_JS', PATH_WWW . 'js/');
define('PATH_SQL', 'common/script_sql/');
define('PATH_LOGOS', 'css/img/logo_clients/');

$PATH_EAI = "eai/";
$PATH_CSS = PATH_WWW . "css/";
$PATH_IMG = PATH_WWW . "css/img/";
$PATH_JS = PATH_WWW . "js/";
$PATH_CACHE_CHART = "app/lib/pChart2.1.3/cache/";
$PATH_FONT_CHART = "lib/pChart2.1.3/font/";

if (!is_dir("common")) {
    $PATH_EAI = "../eai/";
    $PATH_CSS = "../css/";
    $PATH_IMG = "../css/img/";
    $PATH_JS = "../js/";
    $PATH_CACHE_CHART = "../lib/pChart2.1.3/cache/";
    $PATH_FONT_CHART = "../lib/pChart2.1.3/fonts/";
}
//============================================================================
// INCLUDES
//============================================================================
require_once('gui.inc.php');
require_once('database.inc.php');
require_once('text_fr.inc.php');

//============================================================================
// COMMANDS
//============================================================================
class Commands {

    static function COMMAND_HOME() {
        return [
            'action' => RenderUrl(),
            'title' => Strings::LABEL_0034,
            'ui_icon' => 'ui-icon-home',
        ];
    }

    static function COMMAND_MAIN() {
        return [
            'action' => RenderUrl('main'),
            'title' => Strings::LABEL_0015,
            'ui_icon' => 'ui-icon-wrench',
        ];
    }

    static function COMMAND_BACK($action) {
        return [
            'action' => RenderUrl($action),
            'title' => Strings::LABEL_0035,
            'ui_icon' => 'ui-icon-arrowreturnthick-1-w',
        ];
    }

    static function COMMAND_LOGOUT() {
        return [
            'action' => RenderUrl('home/logout'),
            'title' => Strings::LABEL_0036,
            'ui_icon' => 'ui-icon-extlink',
        ];
    }

}

//============================================================================
// PAGES
//============================================================================
$PAGE_0001 = "index.php";
$PAGE_0002 = "adm.php"; //A CODER changer le nom de cette page par adm.php
$PAGE_0003 = "menu.php";
$PAGE_0004 = "eai.php";
$PAGE_0005 = "connexion.php";

define('DEFAULT_CONTROLLER', 'Home');
define('DEFAULT_ACTION', 'index');

define('AJAX_CONTROLLER', 'Ajax');
//============================================================================
// EXCEPTION
//============================================================================
$ERROR_MESSAGE = 0;
$ALERT_MESSAGE = 1;
//============================================================================
// PROFILE
//============================================================================
define('PROFILE_COLLABORATEUR', 1);
define('PROFILE_MANAGER', 2);
define('PROFILE_EXPERT_RH', 3);
define('PROFILE_ADMINISTRATEUR', 4);
define('PROFILE_SUPER_ADMINISTRATEUR', 5);
//============================================================================
// CHECK_REGEX
//============================================================================
$CHECK_CLIENT_NAME = 1; //Vérification de la validité d'un nom de client
$CHECK_DB_NAME = 2; //Vérification de la validité d'un nom de base de données
$CHECK_DATE = 3; //Vérification du format d'une date
$CHECK_PWD_CREATION = 4; //Vérification de la validité d'un mot de passe en mode création
$CHECK_LOGIN = 5; //Vérification de la validité d'un identifiant
$CHECK_EMAIL = 6; //Vérification de la validité d'un email
$CHECK_PWD_UPDATE = 7; //Vérification de la validité d'un mot de passe en mode mise à jour
$CHECK_LOGIN_NOT_EXIST = 8; //Vérification de la non existance de 'identifiant pour eviter de créer des doublons
//============================================================================
// SET_FIELD_MANDATORY
//============================================================================
$SET_DATE_REQUIRED_EAI_CREATION = 1; //Mise en mode obligatoire des champs dates EAI obligatoire en mode création
$SET_DATE_REQUIRED_EAI_UPDATE = 2; //Mise en mode obligatoire des champs dates EAI obligatoire en mode mis à jour
$SET_VALUE_BIN = 3; //Mise à jour de la propriété value en mode binaire (0 ou 1)
$SET_NAME_FILE = 4; //Mise à jour de la propriété obligatoire du champs téléversement logo client
//============================================================================
// DISPLAY TYPE
//============================================================================
$DISPLAY_CREATION = 0; // Affichage d'une interface en mode création
$DISPLAY_VISUALISATION = 1; // Affichage d'une interface en mode visualisation
$DISPLAY_UPDATE = 2; // Affichage d'une interface en mode mise à jour
$DISPLAY_UPDATE_SUP_ADM = 3; // Affichage d'une interface en mode mise à jour pour super administrateur qui peut avoir accès à plus de champs
$DISPLAY_UPDATE_EVALUE = 4; // Affichage d'une interface en mode mise à jour pour collaborateur qui ne peut avoir accès à tous les champs (utilisé par le module EAI)
$DISPLAY_BLANK = 5; // Affichage d'une interface en mode vierge (utilisé dans le module EAI par example)
$DISPLAY_MASS_INJECTION = 6;
//============================================================================
// NAVIGATION OPTION
// Aide à la navigation pour savoir par quelle option nous arrivons
//============================================================================
$MOVE_NEUTRAL = 0; // entrée directe
$MOVE_BACK = 1; // entrée via un bouton retour en arrière
$MOVE_NEXT = 2; // entrée via un bouton suivant
//============================================================================
// FUNCTIONS
//============================================================================

function GetTwigProfile($user) {

    $profile = [
        'user_name' => $user->get_first_name() . ' ' . $user->get_name(),
        'user_role' => $user->get_profile(),
    ];
    $LOGO = $user->obj_Account->getLogo();
    if (isset($LOGO)) {
        $profile['user_logo'] = RenderUrl(PATH_LOGOS . $LOGO);
    } else {
        $profile['user_title'] = $user->obj_Account->get_name();
    }

    return $profile;
}

/* ================================================================================================
  fonction               :   lib_get_eai_template
  description            :   Récupère les modèles EAI de SIRH dans la base de données sirh-central.
  Si un nom de BDD est selectionné alors on va chercher les modèles EAI activés
  sur le client ciblé
  valeur(s) entrante(s)  :   $db_name = nom d'un base de données (non obligatoire)
  valeur(s) sortante(s)  :   Tableau de données
  ================================================================================================ */

function lib_get_eai_template($db_name = NULL) {
    try {
        GLOBAL $REQUEST_040, $REQUEST_109;
        $data = NULL;
        if ($db_name == NULL)
            $data = db_request_select($REQUEST_040);
        else
            $data = db_request_select($REQUEST_109, NULL, $db_name);
        return $data;
    } catch (Exception $e) {
        throw new Exception($e->getMessage());
    }
}

/* ================================================================================================
  fonction               :   lib_check_param_post
  description            :   Cette fonction permet de controler les paramètres arrivant via les formulaires
  en mode POST. Utilisation obligatoire pour éviter toutes injection SQL et autres
  méthode de piratage utilisant et manipulatant les variables POST
  valeur(s) entrante(s)  :   $param_post = variable à controler
  $type_check = type de controle (non obligatoire)
  valeur(s) sortante(s)  :   $post_value = la variable controlée
  ================================================================================================ */

function lib_check_param_post($param_post, $type_check = 0) {
    GLOBAL $CHECK_CLIENT_NAME, $CHECK_DB_NAME, $CHECK_DATE, $CHECK_EMAIL, $CHECK_LOGIN, $CHECK_PWD_CREATION, $CHECK_PWD_UPDATE,
    $MESSAGE_0005, $MESSAGE_0007, $MESSAGE_0015;

    $post_value = NULL;

    if (isset($param_post)) {
        $post_value = htmlspecialchars($param_post);
        switch ($type_check) {
            case $CHECK_CLIENT_NAME:
                if (!lib_check_client_name($post_value))
                    throw new Exception($MESSAGE_0007);
                break;
            case $CHECK_DB_NAME:
                if (!lib_check_db_name($post_value))
                    throw new Exception($MESSAGE_0005);
                break;
            case $CHECK_DATE:
                if (!lib_check_date($post_value))
                    throw new Exception(Strings::MESSAGE_0014 . " : " . $post_value);
                break;
            case $CHECK_EMAIL:
                if (!lib_check_email($post_value))
                    throw new Exception($MESSAGE_0015);
                break;
            case $CHECK_LOGIN:
                if (!lib_check_login($post_value))
                    throw new Exception(Strings::MESSAGE_0018);
                break;
            case $CHECK_PWD_CREATION:
            case $CHECK_PWD_UPDATE:
                if (!lib_check_password($post_value))
                    throw new Exception(Strings::MESSAGE_0017);
                break;
            default:
                break;
        }
    }
    return $post_value;
}

/* ================================================================================================
  fonction               :   lib_change_date_gui_to_mysql
  description            :   Permet de formater une date récupérer d'un champ date pour le mettre
  au format MySQL
  valeur(s) entrante(s)  :   $string_date= la date au format JJ/MM/AAAA
  valeur(s) sortante(s)  :   $date       = la date au format AAAA-MM-JJ
  ================================================================================================ */

function lib_change_date_gui_to_mysql($string_date) {
    $date = NULL;
    if ($string_date != NULL && $string_date != "") {
        $jour = substr($string_date, 0, 2);
        $mois = substr($string_date, 3, 2);
        $annee = substr($string_date, 6, 4);
        $date = $annee . "-" . $mois . "-" . $jour;
    }
    return $date;
}

/* ================================================================================================
  fonction               :   lib_change_date_mysql_to_gui
  description            :   Permet de formater une date récupérer d'un champ MySQL pour le mettre
  au format d'un champ date sur l'interface graphique (jquery-ui)
  valeur(s) entrante(s)  :   $string_date    = la date au format AAAA-MM-JJ
  valeur(s) sortante(s)  :   $date           = la date au format JJ/MM/AAAA
  ================================================================================================ */

function lib_change_date_mysql_to_gui($string_date) {
    $date = NULL;
    if ($string_date != NULL && $string_date != "") {
        $annee = substr($string_date, 0, 4);
        $mois = substr($string_date, 5, 2);
        $jour = substr($string_date, 8, 2);
        $date = $jour . "/" . $mois . "/" . $annee;
    }
    return $date;
}

/* ================================================================================================
  fonction               :   lib_check_date
  description            :   Controle si la date est formaté ainsi: DD/MM/AAAA
  valeur(s) entrante(s)  :   $value          =   date testée
  valeur(s) sortante(s)  :   $verification   =   résultat du controle (booléen)
  ================================================================================================ */

function lib_check_date($value) {
    $verification = false;
    if ($value != NULL && $value != "") {
        if (preg_match("#^[0-9]{2}\/[0-9]{2}\/[0-9]{4}$#", $value))
            $verification = true;
        else
            $verification = false;
    }
    else {
        $verification = true;
    }
    return $verification;
}

/* ================================================================================================
  fonction               :   lib_check_email
  description            :   Controle si l'adresse courriel est formaté correctement
  valeur(s) entrante(s)  :   $value          =   courriel testé
  valeur(s) sortante(s)  :   $verification   =   résultat du controle (booléen)
  ================================================================================================ */

function lib_check_email($value) {
    $verification = false;
    if ($value != NULL && $value != "") {
        if (preg_match("#^([a-z0-9._-])+@([a-z0-9.-])+(.)([a-z]){2,4}$#", $value))
            $verification = true;
        else
            $verification = false;
    }
    else {
        $verification = true;
    }
    return $verification;
}

/* ================================================================================================
  fonction               :   lib_check_client_name
  description            :   Controle si le nom de client est formaté correctement:
  -	doit comporter un nombre de caractères minimum (au moins 3 et au max 20)
  -	doit comporter soit des majuscules, des minuscules, des chiffres, underscore, tiret
  valeur(s) entrante(s)  :   $value          =   nom de client testé
  valeur(s) sortante(s)  :   $verification   =   résultat du controle (booléen)
  ================================================================================================ */

function lib_check_client_name($value) {
    if (preg_match("#^([a-zA-Z0-9_-]{3,20})$#", $value)) // A CODER: un peu trop restrictif, nous devons rajouter d'autre caractères comme les accentués
        return true;
    else
        return false;
}

/* ================================================================================================
  fonction               :   lib_check_db_name
  description            :   Controle si le nom de la base de données est formaté correctement:
  -	doit comporter un nombre de caractères minimum (au moins 3 et au max 20)
  -	doit comporter soit des majuscules, des minuscules, des chiffres, underscore, tiret
  valeur(s) entrante(s)  :   $value          =   nom de la base de données testé
  valeur(s) sortante(s)  :   $verification   =   résultat du controle (booléen)
  ================================================================================================ */

function lib_check_db_name($value) {
    if (preg_match("#^([a-zA-Z0-9_-]{3,12})$#", $value))
        return true;
    else
        return false;
}

/* ================================================================================================
  fonction               :   lib_check_login
  description            :   Controle si l'identifiant est formaté correctement:
  -	doit comporter un nombre de caractères minimum (au moins 6 et au max 20)
  -	doit comporter soit des majuscules, des minuscules, des chiffres, point,
  tiret bas, tiret, et les caractères accentués (éçèàêëîïôöûüâäÉÀÈËËÏÎÖÔÛÜÄÂ)
  valeur(s) entrante(s)  :   $value          =   nom de l'identifiant testé
  valeur(s) sortante(s)  :   $verification   =   résultat du controle (booléen)
  ================================================================================================ */

function lib_check_login($value) {
    if (preg_match("#^([a-zA-ZéçèàêëîïôöûüâäÉÀÈËËÏÎÖÔÛÜÄÂ0-9._-]{6,20})$#", $value))
        return true;
    else
        return false;
}

/* ================================================================================================
  fonction               :   lib_check_password
  description            :   Controle si un mot de passe est formaté correctement:
  -	doit comporter un nombre de caractères minimum (au moins 6, au plus 20)
  -	doit comporter au moins une majuscule (et une minuscule)
  -	doit comporter au moins un chiffre
  -	ne doit comporter aucun espace
  valeur(s) entrante(s)  :   $value          =   mot de passe testé
  valeur(s) sortante(s)  :   $verification   =   résultat du controle (booléen)
  ================================================================================================ */

function lib_check_password($value) {
    if (preg_match("#^(?=.*[a-z]+)(?=.*[A-Z]+)(?=.*[0-9]+)([^\s]{6,20})$#", $value))
        return true;
    else
        return false;
}

/* ================================================================================================
  fonction               :   delete_files
  description            :   Supprime les fichiers d'un repertoire
  valeur(s) entrante(s)  :   $dossier_traite     =   le repertoire à purger
  $extension_choisie  =   extension des fichiers à supprimer
  $age_requis         =   age à partir duquel l'on veut pruger les fichiers
  valeur(s) sortante(s)  :   Néant
  ================================================================================================ */

function delete_files($extension_choisie = 'png', $age_requis = '1800') {
    global $PATH_CACHE_CHART;

    $dossier_traite = $PATH_CACHE_CHART;

    try {

// On ouvre le dossier.
        $repertoire = opendir($dossier_traite);

// On lance notre boucle qui lira les fichiers un par un.
        while (false !== ($fichier = readdir($repertoire))) {
// On met le chemin du fichier dans une variable simple
            $chemin = $dossier_traite . "/" . $fichier;

// Les variables qui contiennent toutes les infos nécessaires.
            $infos = pathinfo($chemin);
            $extension = $infos['extension'];

            $age_fichier = time() - filemtime($chemin);

// On n'oublie pas LA condition sous peine d'avoir quelques surprises. :p
            if ($fichier != "." && $fichier != ".." && !is_dir($fichier) && $extension == $extension_choisie && $age_fichier > $age_requis) {
                unlink($chemin);
            }
        }
        closedir($repertoire); // On ferme !
    } catch (Exception $e) {
        throw new Exception($e->getMessage());
    }
}

/* ================================================================================================
  fonction               :   write_csv_file
  description            :   Créé un fichier CSV avec une extraction de base de donnée
  valeur(s) entrante(s)  :   $titles     =   Un tableau avec les libellés des titres
  $name_file  =   nom du fichier créé avec chemin complet
  $data       =   le tableau des données
  $minus      =   A CODER patch pour enlever les colonnes finales vides (bug à corriger mais livraisons à faire)
  valeur(s) sortante(s)  :   Néant
  ================================================================================================ */

function write_csv_file($titles, $name_file, $data, $minus) {
    try {
        $fp = fopen($name_file, 'w');

        $delimiter = ';';
        $csv = new SplFileObject($name_file, 'w');

// On écrit le titre
        /* $line = '"';
          $line .= implode('";"', $titles);
          $line .= '"';
          $line .= "\r\n";
          $csv->fwrite($line); */
        fputcsv($fp, $titles, $delimiter);

        for ($i = 0, $s = (count($data)); $i < $s; $i++) {
//$line = '"';
            $fields = array();
            for ($i1 = 0, $s1 = (count($data[$i]) - $minus); $i1 < $s1; $i1++) {
//if($i1!=0) $line .= '";"' ;
//	$line .= (string)$data[$i][$i1];

                $fields[$i1] = (string) $data[$i][$i1];
            }
            fputcsv($fp, $fields, $delimiter);
//$line .= '"';
//$line .= "\r\n";
//$csv->fwrite($line);
        }
    } catch (Exception $e) {
        throw new Exception($e->getMessage());
    }
}
